package com.bsoft.project.utils;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.bsoft.project.controller.RsfComlfsServiceController;
import com.bsoft.project.mapper.RsfComlfsServiceMapper;
import com.bsoft.project.model.MlcxVoExcel;

public class ExcelListener extends AnalysisEventListener<MlcxVoExcel>  {
	private final Logger logger = LoggerFactory.getLogger(RsfComlfsServiceController.class);
	
	private static int count = 0;
	
	//类型
	private String MLLX = "";
	// 由于每次读都是新new ExcelListener的，所以这个list不会存在线程安全问题
	List<MlcxVoExcel> list = new ArrayList<>();
	
	public RsfComlfsServiceMapper rsfComlfsServiceMapper;
    public ExcelListener() {}
    public ExcelListener(RsfComlfsServiceMapper rsfComlfsServiceMapper,String MLLX) {
        this.rsfComlfsServiceMapper = rsfComlfsServiceMapper;
        this.MLLX = MLLX;
        ExcelListener.count = 0;
    }

	// 这个组件是Spring中的组件，这边推荐两种方法注入这个组件
	// 第一种就是提供一个UserInfoDataListener的构造方法，这个方法提供一个参数是UserInfoDataListener类型
	// 另外一种方法就是将 UserInfoDataListener 这个类定义成 UserService 实现类的内部类（推荐这种方式）
	// private UserService userService;

	@Override
	public void invoke(MlcxVoExcel data, AnalysisContext analysisContext) {
		
		if(isOutDate(data)){
			data.setMllx(MLLX);
//			logger.info("解析到一条数据:{}", JSON.toJSONString(data));
			saveData(data);
		}else{
			logger.info(count + " 行结束时间 大于当前日期！");
			logger.info("解析到一条数据:{}", JSON.toJSONString(data));
		}
		count++;
	}
	
	  //读取表头内容
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
    	logger.info("表头："+headMap);
    }

	@Override
	public void doAfterAllAnalysed(AnalysisContext analysisContext) {
		// 这里也要保存数据，确保最后遗留的数据也存储到数据库
		logger.info(count + "所有数据解析完成！");
	}

	private void saveData(MlcxVoExcel data) {
		// 保存数据
		try{
			rsfComlfsServiceMapper.insertUpdateMLCXExcel(data);
		}catch(Exception e){
			logger.info(count + " 行出错！");
			logger.info("解析到一条数据:{}", JSON.toJSONString(data));
		}
		if(count%1000 == 0){
			logger.info(count + " 解析完成！");
		}
	}
	
	private boolean isOutDate(MlcxVoExcel data){
		
		Date now = new Date();
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");//可以方便地修改日期格式
		int nowDate = Integer.valueOf(dateFormat.format(now));
		int endDate = Integer.valueOf(data.getEnddate());
		return endDate >= nowDate;
	}
}
